//
//  UIImage+xsViewToImage.m
//  digital_robot_demo
//
//  Created by xskj on 2024/9/6.
// 把UIView转成UIimage

#import "UIImage+xsViewToImage.h"

@implementation UIImage (xsViewToImage)


+ (UIImage *)xsConvertViewToImage:(UIView *)view {
    // 1. 获取视图的尺寸
    CGSize size = view.bounds.size;
    // 2. 创建一个基于位图的图形上下文，其大小与视图的尺寸相匹配
    UIGraphicsBeginImageContextWithOptions(size, view.isOpaque, 0.0);
    // 3. 将视图的层级绘制到当前图形上下文中
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    // 4. 从图形上下文中获取图像
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    // 5. 结束图像上下文
    UIGraphicsEndImageContext();
      
    // 6. 返回生成的图像
    return image;
}

//使用快照（iOS 10+）
+ (UIImage *)xsConvertViewToImageUsingSnapshot:(UIView *)view {
    // 创建一个快照视图
    UIView *snapshotView = [view snapshotViewAfterScreenUpdates:YES];
    // 快照视图不会自动添加到任何父视图中，所以我们只需要从它那里获取图像
    UIGraphicsBeginImageContextWithOptions(snapshotView.bounds.size, snapshotView.isOpaque, 0.0);
    [snapshotView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    // 释放快照视图（虽然ARC会处理这个，但显式释放是个好习惯）
    snapshotView = nil;
      
    return image;
}

// 裁切一个指定rect的图形 及上层的view  不是在其身上也是可以裁切到
+ (UIImage *)xsConvertViewRegionToImage:(UIView *)view region:(CGRect)region {
    // 确保区域不超出视图的边界
    CGRect intersection = CGRectIntersection(view.bounds, region);
    if (CGRectIsEmpty(intersection)) {
        return nil;
    }
      
    // 创建一个足够大的图形上下文来包含裁剪后的区域
    UIGraphicsBeginImageContextWithOptions(intersection.size, view.isOpaque, 0.0);
      
    // 保存当前的图形上下文状态
    CGContextSaveGState(UIGraphicsGetCurrentContext());
      
    // 移动上下文原点以匹配裁剪区域的左上角
    CGContextTranslateCTM(UIGraphicsGetCurrentContext(), -intersection.origin.x, -intersection.origin.y);
      
    // 绘制视图的图层（注意：这会绘制整个视图，但我们稍后会裁剪图像）
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
      
    // 裁剪到所需的区域（实际上，这一步在图像上下文中不是必要的，因为我们会直接裁剪生成的UIImage）
    // 但在这里，我们只是为了演示如何裁剪上下文（虽然它在这个上下文中不起作用）
    // CGContextClipToRect(UIGraphicsGetCurrentContext(), intersection);
      
    // 从图形上下文中获取完整的图像，但我们稍后会裁剪它
    UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();
      
    // 结束并恢复图形上下文状态
    CGContextRestoreGState(UIGraphicsGetCurrentContext());
    UIGraphicsEndImageContext();
      
//    // 裁剪完整的图像以获取所需的部分
//    CGImageRef imageRef = CGImageCreateWithImageInRect([fullImage CGImage], intersection);
//    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef scale:fullImage.scale orientation:fullImage.imageOrientation];
//      
//    // 释放CGImage
//    CGImageRelease(imageRef);
//      
//    // 返回裁剪后的图像
//    return croppedImage;
    return fullImage;
}

//+ (UIImage *)captureView:(UIView *)view inRect:(CGRect)rect {
//    // 创建一个图形上下文，大小为截取区域的尺寸
//    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
//    
//    // 将指定的视图及其子视图绘制到图形上下文中
//    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];
//    
//    // 从图形上下文中获取UIImage
//    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
//    
//    // 释放图形上下文资源
//    UIGraphicsEndImageContext();
//    
//    return image;
//}
//
////传入需要截取的view
//+(UIImage *)screenShotView:(UIView *)view{
//       UIImage *imageRet = [[UIImage alloc]init];
//       UIGraphicsBeginImageContextWithOptions(view.frame.size, false, 0.0);
//       [view.layer renderInContext:UIGraphicsGetCurrentContext()];
//       imageRet = UIGraphicsGetImageFromCurrentImageContext();
//       UIGraphicsEndImageContext();
//
//       return imageRet;
//}

// 注意xlMirrorImageView是设置过frame的
// 左右镜像 -1向右镜像  1左镜像
+(void)XLMirrorImageViewWithImageView:(UIImageView *)xlMirrorImageView withLeftOrRight:(int)xInt{
    
    xlMirrorImageView.transform = CGAffineTransformMakeScale(xInt, 1.0);
}
@end


//在Objective-C中，如果你想要设置UIImageView的图片为镜像效果，你可以通过修改图片的transform属性来实现。镜像效果通常有两种：水平镜像（左右翻转）和垂直镜像（上下翻转）。
//水平镜像（左右翻转）
//要实现水平镜像效果，你可以将图片的transform属性设置为一个水平翻转的变换。这可以通过CGAffineTransformMakeScale函数来实现，其中x轴的比例设置为-1（表示水平翻转），y轴的比例保持为1（表示垂直方向不变）。
//objective-c
//复制代码
//UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yourImageName"]];
//imageView.transform = CGAffineTransformMakeScale(-1.0, 1.0);
//// 注意：这会将图片的原点移动到其右侧，因此你可能还需要调整imageView的frame或center属性来确保它显示在你想要的位置
//imageView.center = CGPointMake(desiredCenterX, imageView.center.y); // 根据需要调整desiredCenterX
//但是，仅仅这样做可能会让图片看起来像是从右边移出了屏幕。为了修正这个问题，你还需要将imageView的center属性沿着x轴移动其宽度的一半（或者根据你的布局需求进行适当调整）。
//垂直镜像（上下翻转）
//对于垂直镜像（上下翻转），你可以将y轴的比例设置为-1，而x轴的比例保持为1。
//objective-c
//复制代码
//UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yourImageName"]];
//imageView.transform = CGAffineTransformMakeScale(1.0, -1.0);
//// 垂直镜像通常不需要调整imageView的位置，因为它不会改变图片在屏幕上的水平位置
//完整示例
//这里是一个完整的示例，展示了如何创建一个UIImageView，将其图片设置为水平镜像，并调整其位置以确保它仍然显示在屏幕上：
//objective-c
//复制代码
//UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yourImageName"]];
//imageView.frame = CGRectMake(100, 100, 200, 200); // 假设的frame，根据需要调整
//imageView.transform = CGAffineTransformMakeScale(-1.0, 1.0);
//// 由于水平翻转，我们需要将imageView的center向左移动其宽度的一半
//imageView.center = CGPointMake(imageView.center.x - imageView.bounds.size.width / 2, imageView.center.y);
//[self.view addSubview:imageView]; // 假设self.view是你的主视图
//请注意，上述代码中的self.view应该替换为你想要添加imageView作为子视图的任何UIView实例。此外，CGRectMake和CGPointMake函数在较新版本的iOS中已被CGRect和CGPoint的字面量语法所取代，但为了保持示例的兼容性，这里仍然使用了这些函数。
